﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLGeomecanica
    {
        #region Metodos
        /// <summary>
        /// Devuelve la lista de Geomecanicas
        /// </summary>
        /// <returns></returns>
        public List<Geomecanica> ListarGeomecanica()
        {
            return Accesor.ListarGeomecanica();
        }

        /// <summary>
        /// Devuelve la lista de Geomecanicas por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<Geomecanica> BuscarGeomecanicaPorSondaje(int codigoSondaje)
        {
            return Accesor.BuscarGeomecanicaPorSondaje(codigoSondaje);
        }

        /// <summary>
        /// Registra nuevo Geomecanica
        /// </summary>
        /// <param name="Geomecanica"></param>
        /// <returns></returns>
        public string InsertarGeomecanica(Geomecanica geomecanica)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(geomecanica.CodigoSondaje, geomecanica.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            geomecanica.CodigoGeomecanica = Accesor.GenerarCodigoGeomecanica(geomecanica.CodigoSondaje);
            geomecanica.ValorRMR = this.GenerarValorRMR(geomecanica);
             Accesor.InsertarGeomecanica(geomecanica);

             return result;
        }

        /// <summary>
        /// Modifica un Geomecanica
        /// </summary>
        /// <param name="Geomecanica"></param>
        public string ModificarGeomecanica(Geomecanica geomecanica)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(geomecanica.CodigoSondaje, geomecanica.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            var geomecanicaEdit = Accesor.ObtenerGeomecanica(geomecanica.CodigoSondaje, geomecanica.CodigoGeomecanica);
            if (geomecanicaEdit != null)
            {
                geomecanicaEdit.Desde = geomecanica.Desde;
                geomecanicaEdit.Hasta = geomecanica.Hasta;
                geomecanicaEdit.CodigoGeologo = geomecanica.CodigoGeologo;
                geomecanicaEdit.CodigoTipoResistencia = geomecanica.CodigoTipoResistencia;
                geomecanicaEdit.CodigoTipoCalidadRoca = geomecanica.CodigoTipoCalidadRoca;
                geomecanicaEdit.CodigoTipoRelleno = geomecanica.CodigoTipoRelleno;
                geomecanicaEdit.CodigoTipoPersistencia = geomecanica.CodigoTipoPersistencia;
                geomecanicaEdit.CodigoTipoAbertura = geomecanica.CodigoTipoAbertura;
                geomecanicaEdit.CodigoTipoRugosidad = geomecanica.CodigoTipoRugosidad;
                geomecanicaEdit.CodigoTipoAgua = geomecanica.CodigoTipoAgua;
                geomecanicaEdit.CodigoTipoEspaciado = geomecanica.CodigoTipoEspaciado;
                geomecanicaEdit.CodigoTipoAlteracion = geomecanica.CodigoTipoAlteracion;
                geomecanicaEdit.CodigoTipoJunta = geomecanica.CodigoTipoJunta;
                geomecanicaEdit.ValorRMR = this.GenerarValorRMR(geomecanica);
                geomecanicaEdit.Fecha = geomecanica.Fecha;
                geomecanicaEdit.Observacion = geomecanica.Observacion;
                geomecanicaEdit.PorcentajeRecuperacion = geomecanica.PorcentajeRecuperacion;
                Accesor.ModificarGeomecanica(geomecanicaEdit);
            }
            return result;

        }

        /// <summary>
        /// Eliminar un Geomecanica
        /// </summary>
        /// <param name="Geomecanica"></param>
        public void EliminarGeomecanica(int codigoSondaje, int codigoGeomecanica)
        {
            var geomecanica = Accesor.ObtenerGeomecanica(codigoSondaje, codigoGeomecanica);
            if (geomecanica != null)
            {
                Accesor.EliminarGeomecanica(geomecanica);
            }

        }

        /// <summary>
        /// Obtiene un Geomecanica
        /// </summary>
        /// <param name="codigoGeomecanica"></param>
        /// <returns></returns>
        public Geomecanica ObtenerGeomecanica(int codigoSondaje, int codigoGeomecanica)
        {
            return Accesor.ObtenerGeomecanica(codigoSondaje, codigoGeomecanica);
        }

        /// <summary>
        /// Devuelve la lista de Geomecanicas por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<buscarGeomecanica_Result> BuscarGeomecanicaPorSondaje1(int codigoSondaje)
        {
            return Accesor.BuscarGeomecanicaPorSondaje1(codigoSondaje);
        }

        /// <summary>
        /// Genera el Valor de RMR
        /// </summary>
        /// <returns></returns>
        public double GenerarValorRMR(Geomecanica geomecanica)
        {
            double valorRMR = 0;
            double valorResistencia = new DATipoResistencia().ObtenerTipoResistencia(geomecanica.CodigoTipoResistencia).Valor;
            double valorCalidadRoca = new DATipoCalidadRoca().Obtener(geomecanica.CodigoTipoCalidadRoca).Valor;
            double valorEspaciado = new DATipoEspaciado().Obtener(geomecanica.CodigoTipoEspaciado).Valor;
            double valorPersistencia = new DATipoPersistencia().ObtenerTipoPersistencia(geomecanica.CodigoTipoPersistencia).Valor;
            double valorAbertura = new DATipoAbertura().Obtener(geomecanica.CodigoTipoAbertura).Valor;
            double valorTipoRugosidad = new DATipoRugosidad().ObtenerTipoRugosidad(geomecanica.CodigoTipoRugosidad).Valor;
            double valorRelleno = new DARelleno().ObtenerRelleno(geomecanica.CodigoTipoRelleno).Valor;
            double valorTipoAlteracion = new DATipoAlteracion().Obtener(geomecanica.CodigoTipoAlteracion).Valor;
            double valorAguaSubterranea = new DATipoAgua().Obtener(geomecanica.CodigoTipoAgua).Valor;

            valorRMR = valorResistencia + valorCalidadRoca + valorEspaciado + valorPersistencia + valorAbertura + valorTipoRugosidad + valorRelleno + valorTipoAlteracion + valorAguaSubterranea;

            //Determinar la Clasificiacion y grabar en Geomecanica ?
            var claseMacizoRocoso = new DAClaseMacizoRocoso().ObtenerClaseMacizoRocosoPorRango((int)valorRMR);
            if (claseMacizoRocoso != null)
                geomecanica.CodigoClaseMacizoRocoso = claseMacizoRocoso.CodigoClaseMacizoRocoso;


            return valorRMR;
        }

        /// <summary>
        /// Validar Interseccion
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <param name="tipoAnalisis"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public int ValidarInterseccionGeomecanica(int codigoSondaje, int codigoGeomecanica, double desde, double hasta)
        {
            return Accesor.ValidarInterseccionGeomecanica(codigoSondaje, codigoGeomecanica, desde, hasta);
        }

        /// <summary>
        /// Devuelve el ultimo Hasta
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public double ObtenerUltimoHasta(int codigoSondaje)
        {
            return Accesor.ObtenerUltimoHasta(codigoSondaje);
        }

        #endregion

        #region Accesor
        private static DAGeomecanica Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAGeomecanica(); }
        }

        #endregion Accesor
    }
}
